/*
 * Created on 17-sep-2008
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package com.gestores;

import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.NamingException;

import com.beans.NoticiaBean;
import com.beans.UsuarioBean;
import com.util.Conectar;
import com.util.Utils;

/**
 * @author vPalomo
 *
 * Clase con las utilidades necesarias para crear, eliminar y modificar noticias. No se encarga de la parte de
 * archivos por lo que habrá que tratar los archivos en la clase RequestHandler correspondiente
 */
public class GestionNoticias {
    //private static GestionNoticias instancia=null;
    private GestionNoticias() { }  //Constructor privado
    
    public static synchronized GestionNoticias getInstance() {
//        if(instancia==null) {
//            instancia=new GestionNoticias();
//        }
//        return instancia;
        return new GestionNoticias();
    }
    /**
     * Compueba si el usuario tiene permisos en el area indicada
     * @param usu
     * @param area
     * @return true si tiene permisos y false si no los tiene
     */
    private boolean usuarioValido(UsuarioBean usu, String area) {
        if(!usu.categoriaValida("4")){ //El 4 indica que las noticias son la categoria 4, si fuese la 6 habria que cambiarlo
            System.out.println("[GestionNoticias]El usuario "+usu.getNick()+ " esta intentado acceder a una categoria no valida");
            return false;
        }
        if(!usu.areaValida(area)) {
            System.out.println("[GestionNoticias]El usuario "+usu.getNick()+ " esta intentado acceder a un area no valida para el("+area+")");
            return false;
        }
        return true;
        
    }
    
    /**
     * Pasamos una noticia y el usuario que la esta creando y se guarda la noticia en la base de datos.
     * Si el usuario no puede crear esa noticia no la crear
     * @param noticia
     * @param usuario
     * @return true si se ha creado la noticia y false si por algun motivo no se ha podido crear.
     */
    public boolean crear(NoticiaBean noticia, UsuarioBean usuario){
        if(!usuarioValido(usuario,noticia.getArea())){ 
            return false;
        }
        boolean result=false;
        Connection connection = null;
        PreparedStatement insertStatement = null;
        String insertStr = "INSERT INTO `noticias` (`titular`,`contenido`,`autor`,`fechaCreacion`,`fechaPublicacion`,`historica`,`idArea`,`imagen`,`archivoImagen`)"
                +" VALUES (?,?,?,?,?,?,?,?,?)";
        try {
            connection = Conectar.getConnection();
            insertStatement = connection.prepareStatement(insertStr);
            insertStatement.setString(1, noticia.getTitular());
            insertStatement.setString(2, noticia.getContenido());
            insertStatement.setString(3, noticia.getNick());
            insertStatement.setString(4, Utils.fechaParaMysql(noticia.getFechaAlta()));
            insertStatement.setString(5, Utils.fechaParaMysql(noticia.getFechaPublicacion()));
            insertStatement.setString(6, "NO");
            insertStatement.setString(7, noticia.getArea());
            insertStatement.setString(8, noticia.getImagen());
            insertStatement.setString(9, noticia.getArchivoImagen());
            insertStatement.executeUpdate();
            
            //De guardar las imagenes en disco se encarga la clase RequestHandler.
            result=true;
            
        }catch(Exception e){
            System.out.println(e.getMessage());
        }finally {
            try {
                if(insertStatement!=null)insertStatement.close();
                if(connection!=null)connection.close();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        return result;
    }
    
    /**
     * Devuelve la noticia correspondiente con el id que pasemos, si el id no existe devuelve null
     * @param idNoticia
     * @return null o la noticia
     */
    public NoticiaBean consultaNoticia(String idNoticia) {
        Connection conexion=null;
        NoticiaBean noticia=null;
        PreparedStatement selectStatement = null;
        try {
            conexion = Conectar.getConnection();
            System.out.println("Consultando "+idNoticia);
            String selectCustomerStr = "SELECT * FROM noticias " +
                    "WHERE idNoticia = ?";
            
            selectStatement = (PreparedStatement) conexion.prepareStatement(selectCustomerStr);

            selectStatement.setString(1, idNoticia);
            ResultSet rs = selectStatement.executeQuery();
            
            String aux = "";
            if (rs.next()) {
                noticia=new NoticiaBean();
                noticia.setIdNoticia(idNoticia);
                noticia.setTitular(rs.getString("titular"));
                noticia.setContenido(rs.getString("contenido"));
                aux= Utils.fecha(rs.getString("fechaCreacion"));
                noticia.setFechaAlta(aux);
                aux= Utils.fecha(rs.getString("fechaPublicacion"));
                noticia.setFechaPublicacion(aux);
                noticia.setNick(rs.getString("autor"));
                noticia.setArea(rs.getString("idArea"));
                noticia.setHistorica(rs.getString("historica"));
                noticia.setImagen(rs.getString("imagen"));
                noticia.setArchivoImagen(rs.getString("archivoImagen"));
                
            } 
            rs.close();
            
        } catch (NamingException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }finally {
            try {
                if(selectStatement!=null)selectStatement.close();
                if(conexion!=null)conexion.close();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        return noticia;
    }
    /**
     * Pasamos el id de la noticia a eliminar y el usuario que la quiere eliminar. Si el usuario tiene permisos
     * se elimina. Tambien se comprueba que la noticia sea suya.
     * @param idNoticia id de la noticia a eliminar
     * @param usuario Usuario que quiere eliminar la noticia
     * @return true si se elimina y false si por algun motivo no se ha podido eliminar
     */
    public boolean eliminar(String idNoticia, UsuarioBean usuario) {
        Connection conexion=null;
        NoticiaBean noticia=null;
        PreparedStatement updateStatement = null;
        noticia=consultaNoticia(idNoticia); //Primero cargamos los datos de la noticia a borrar
        if(!usuarioValido(usuario,noticia.getArea())){ 
            return false;
        }
        boolean result=false;
        try {
            if(noticia==null) {
                System.out.println("[GestionNoticias.eliminar]Se esta intentando borrar la noticia "+noticia.getIdNoticia()+" y no existe en la base de datos");
                return false; //Si la noticia es null es que no se ha podido consultar
            }
            if(!noticia.getNick().equalsIgnoreCase(usuario.getNick())) {
                System.out.println("[GestionNoticias.eliminar]Se esta intentando borrar la noticia "+noticia.getIdNoticia()+" y el usuario "+usuario.getNick()+" no es el autor");
                return false;
            }
            borrarArchivo(noticia.getArchivoImagen()+".jpg");
            borrarArchivo(noticia.getArchivoImagen()+"150x150.jpg");
            conexion = Conectar.getConnection();
            String updateSQL = "DELETE from noticias WHERE noticias.idNoticia = ?";  
            updateStatement = (PreparedStatement) conexion.prepareStatement(updateSQL);
            updateStatement.setString(1, noticia.getIdNoticia());
            updateStatement.executeUpdate();
            result= true;
        } catch (NamingException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }finally {
            try {
                if(updateStatement!=null)updateStatement.close();
                if(conexion!=null)conexion.close();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        return result;
    }
    /**
     * Modifica la noticia que pasemos, el id de la noticia debe ser el de la noticia que queremos modificar 
     * @param noticia La noticia que pasemos tiene que llevar rellenos todos los campos, solo pueden quedar en blanco
     * los relacionados a la imagen. tampoco es necesario pasar el campo historica, aunque se pase no se
     * actualizara.
     * @param usuario Usuario que quiere realizar la modificacion
     * @return true si se modifica y false si por algun motivo no se puede hacer la modificacion
     */
    public boolean modificar(NoticiaBean noticia, UsuarioBean usuario) {
        Connection conexion=null;
        PreparedStatement updateStatement = null;
        boolean result=false;
        if(!usuarioValido(usuario,noticia.getArea())){ 
            return false;
        }
        if(!noticia.getNick().equalsIgnoreCase(usuario.getNick())) {
            System.out.println("[GestionNoticias.modificar]Se esta intentando modificar la noticia "+noticia.getIdNoticia()+" y el usuario "+usuario.getNick()+" no es el autor");
            return false;
        }
        try {
            
            conexion = Conectar.getConnection();
            String updateSQL = "update noticias set titular=? ,contenido=?"+
                    " ,fechaPublicacion=?"+
                    ",idArea=? ";
            if(!noticia.getImagen().equalsIgnoreCase("")){
                updateSQL+=", imagen=? ,archivoImagen=? ";
            }
            updateSQL+="where idNoticia=?";
            
            updateStatement = (PreparedStatement) conexion.prepareStatement(updateSQL);
            updateStatement.setString(1, noticia.getTitular());
            updateStatement.setString(2, noticia.getContenido());
            updateStatement.setString(3, Utils.fechaParaMysql(noticia.getFechaPublicacion()));
            updateStatement.setString(4, noticia.getArea());
            if(noticia.getImagen().equalsIgnoreCase("")){
                updateStatement.setString(5, noticia.getIdNoticia());
            }else{
                updateStatement.setString(5, noticia.getImagen());
                updateStatement.setString(6, noticia.getArchivoImagen());
                updateStatement.setString(7, noticia.getIdNoticia());
            }
            updateStatement.executeUpdate();
            result= true;
        } catch (NamingException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }finally {
            try {
                if(updateStatement!=null)updateStatement.close();
                if(conexion!=null)conexion.close();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        return result;
    }
    
    public boolean ponerHistorica(boolean estado,String idNoticia, UsuarioBean usuario) {
        Connection conexion=null;
        PreparedStatement updateStatement = null;
        String sEstado;
        boolean result=false;
        NoticiaBean noticia=this.consultaNoticia(idNoticia);
        
        if(!usuarioValido(usuario,noticia.getArea())){ 
            return false;
        }
        if(!noticia.getNick().equalsIgnoreCase(usuario.getNick())) {
            System.out.println("[GestionNoticias.ponerHistorica]Se esta intentando modificar la noticia "+noticia.getIdNoticia()+" y el usuario "+usuario.getNick()+" no es el autor");
            return false;
        }
        if(estado){
            sEstado="SI";
        }else{
            sEstado="NO";
        }
        try {
            conexion = Conectar.getConnection();
            String updateSQL = "UPDATE noticias SET " +
                    " historica=?  WHERE noticias.idNoticia = ?";

            
            updateStatement = (PreparedStatement) conexion.prepareStatement(updateSQL);
            updateStatement.setString(1, sEstado);
            updateStatement.setString(2, idNoticia);
            updateStatement.executeUpdate();
            System.out.println(updateStatement.toString());
            result=true;

        } catch (NamingException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }finally {
            try {
                if(updateStatement!=null)updateStatement.close();
                if(conexion!=null)conexion.close();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
        return result;
    }
    
    /**
     * Elimina del disco duro el archivo que pasemos por parametros
     * @param name
     * @return
     */
    private boolean borrarArchivo(String name) {
        String archivo = "/var/lib/tomcat5.5/webapps/archivos/imagenes/noticias/" + name;
        System.out.println("[GestionNoticias.borrarArchvivo()]Borrando archivo: " + archivo);
        File f = new File(archivo);
        if (f.delete()) {
            return true;
        } else {
            return false;
        }
    }
    
}
